package tool

import (
	"asocrawler/conf"
	"fmt"
	"log"

	"github.com/tebeka/selenium"
	"github.com/tebeka/selenium/chrome"
)

var port = conf.Conf.BrowserPort

var service *selenium.Service

var maxLen = 5

var limitBrowserCountChan = make(chan bool, 3)

func init() {
	var err error
	opts := make([]selenium.ServiceOption, 0)
	service, err = selenium.NewChromeDriverService(conf.Conf.SeleniumPath, port, opts...)
	if err != nil {
		panic("启动浏览器驱动服务失败,err= " + err.Error())
	}
	// 限制打开浏览器窗口的数量
	for i := 0; i < 3; i++ {
		limitBrowserCountChan <- true
	}
}

// 打开一个浏览器
func OpenWebDriver() (selenium.WebDriver, error) {
	if len(limitBrowserCountChan) == 0 {
		log.Println("【warn】浏览器打开数量已达到上限:", cap(limitBrowserCountChan))
	}
	<-limitBrowserCountChan
	log.Println("【warn】可打开浏览器数量剩余:", len(limitBrowserCountChan))
	//链接本地的浏览器 chrome
	caps := selenium.Capabilities{
		"browserName": "chrome",
	}
	//禁止图片加载，加快渲染速度
	imagCaps := map[string]interface{}{
		//"profile.managed_default_content_settings.images": 2,
	}
	chromeCaps := chrome.Capabilities{
		Prefs: imagCaps,
		Path:  "",
		ExcludeSwitches: []string{
			"enable-automation",
		}, //修改window.navigator.webdriver为undefined 防反爬
		Args: []string{
			// "--headless", // 设置Chrome无头模式，在linux下运行，需要设置这个参数，否则会报错
			//"--no-sandbox",
			"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36", // 模拟user-agent，防反爬
		},
	}
	//以上是设置浏览器参数
	caps.AddChrome(chromeCaps)
	return selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
}

// 隐式打开一个浏览器
func OpenHeadLessWebDriver() (selenium.WebDriver, error) {
	if len(limitBrowserCountChan) == 0 {
		log.Println("【warn】浏览器打开数量已达到上限:", cap(limitBrowserCountChan))
	} else {
		log.Println("【warn】可打开浏览器数量剩余:", len(limitBrowserCountChan)-1)
	}
	<-limitBrowserCountChan
	//链接本地的浏览器 chrome
	caps := selenium.Capabilities{
		"browserName": "chrome",
	}
	//禁止图片加载，加快渲染速度
	imagCaps := map[string]interface{}{
		//"profile.managed_default_content_settings.images": 2,
	}
	chromeCaps := chrome.Capabilities{
		Prefs: imagCaps,
		Path:  "",
		ExcludeSwitches: []string{
			"enable-automation",
		}, //修改window.navigator.webdriver为undefined 防反爬
		Args: []string{
			"--headless", // 设置Chrome无头模式，在linux下运行，需要设置这个参数，否则会报错
			"--no-sandbox",
			"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36", // 模拟user-agent，防反爬
		},
	}
	//以上是设置浏览器参数
	caps.AddChrome(chromeCaps)
	return selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
}

//针对海外谷歌登录
func OpenGoogleWebDriver() (selenium.WebDriver, error) {
	if len(limitBrowserCountChan) == 0 {
		log.Println("【warn】浏览器打开数量已达到上限:", cap(limitBrowserCountChan))
	}
	<-limitBrowserCountChan
	log.Println("【warn】可打开浏览器数量剩余:", len(limitBrowserCountChan))
	//链接本地的浏览器 chrome
	caps := selenium.Capabilities{
		"browserName": "chrome",
	}
	//禁止图片加载，加快渲染速度
	imagCaps := map[string]interface{}{
		//"profile.managed_default_content_settings.images": 2,
	}
	chromeCaps := chrome.Capabilities{
		Prefs: imagCaps,
		Path:  "",
		ExcludeSwitches: []string{
			"enable-automation",
		}, //修改window.navigator.webdriver为undefined 防反爬
		Args: []string{
			//"--headless", // 设置Chrome无头模式，在linux下运行，需要设置这个参数，否则会报错
			//"--no-sandbox",
			"--user-agent=Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136", // 模拟user-agent，防反爬
		}, //Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
	}
	//以上是设置浏览器参数
	caps.AddChrome(chromeCaps)
	return selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
}

func StopBrowser() error {
	return service.Stop()
}

func PutBrowserPool() {
	limitBrowserCountChan <- true
	log.Println("【warn】可打开浏览器数量+1，剩余:", len(limitBrowserCountChan))
}
